package com.ppt.javappt.util;
import com.fasterxml.jackson.core.type.TypeReference;
import com.fasterxml.jackson.databind.ObjectMapper;
import javafx.stage.FileChooser;
import javafx.stage.Stage;

import java.io.File;


/**
 * @author cys
 */
public class FileUtil {
    // 单例 ObjectMapper 实例
    private static final ObjectMapper objectMapper = new ObjectMapper();

    /**
     * 打开文件
     * @param stage 父窗口
     * */
    public static File openFile(Stage stage) {
        // 创建文件选择器
        FileChooser fileChooser = new FileChooser();
        // 设置初始目录
        fileChooser.setInitialDirectory(new File(System.getProperty("user.home")));
        fileChooser.setTitle("选择打开的文件");
        // 添加类型过滤器
        fileChooser.getExtensionFilters().addAll(
                new FileChooser.ExtensionFilter("JavaPPT","*.jppt"),
                new FileChooser.ExtensionFilter("所有类型","*.*")
        );

        return fileChooser.showOpenDialog(stage);
    }
    /**
     * 保存文件
     * @param stage 父窗口
     * */
    public static File saveFile(Stage stage,String title){
        // 创建文件选择器
        FileChooser fileChooser = new FileChooser();
        // 设置初始目录
        fileChooser.setInitialDirectory(new File(System.getProperty("user.home")));
        fileChooser.setTitle(title);
        fileChooser.setInitialFileName("XXX.jppt");
        // 添加类型过滤器
        fileChooser.getExtensionFilters().addAll(
                new FileChooser.ExtensionFilter("JavaPPT","*.jppt"),
                new FileChooser.ExtensionFilter("pdf",".pdf")
        );

        return fileChooser.showSaveDialog(stage);
    }
    /**
     * 导出单页幻灯片为图片
     * @param stage 父窗口
     * */
    public static File saveImage(Stage stage){
        // 创建文件选择器
        FileChooser fileChooser = new FileChooser();
        // 设置初始目录
        fileChooser.setInitialDirectory(new File(System.getProperty("user.home")));
        fileChooser.setTitle("保存为图片");
        fileChooser.setInitialFileName("XXX.png");
        // 添加类型过滤器
        fileChooser.getExtensionFilters().addAll(
                new FileChooser.ExtensionFilter("png","*.png"),
                new FileChooser.ExtensionFilter("jpg",".jpg")
        );

        return fileChooser.showSaveDialog(stage);
    }

    /**
     * 把对象写入文件 (JSON格式)
     * @param obj 对象
     * @param file 文件
     * @param <T> 对象类型
     * */
    public static <T> void  writeObjectToFile(T obj,File file) throws Exception{
        if(file == null){
            throw new Exception("文件不能为null");
        }
        if(obj == null){
            throw new Exception("写入对象不能为空");
        }
        objectMapper.writeValue(file,obj);
    }
    /**
     * 从文件读取泛型对象
     * @param file 文件
     * @param typeReference 类型引用（如new TypeReference<List<String>>() {}）
     * @param <T> 对象类型
     * @return 读取到的对象
     */
    public static <T> T readObjectFromFile(File file, TypeReference<T> typeReference) throws Exception {
        if (file == null) {
            throw new Exception("文件不能为null");
        }
        if (typeReference == null) {
            throw new IllegalArgumentException("类型引用不能为null");
        }

        return objectMapper.readValue(file, typeReference);
    }
}
